package d2_final_exam.d4_fourth_question;

import java.util.List;
import java.util.Random;

//1、使用第一种方式,进行创建线程,继承Thread
public class RedThread extends Thread {


    private final List<Integer> reEnvelope;
    private final List<String> allMoney;
    private Random r = new Random();

    public RedThread(List<Integer> redEnvelope, List<String> allMoney, String name) {
        //3、将name传给父类,进行初始化
        super(name);
        //4、定义一个成员变量记录共享资源,便于线程1操作
        this.reEnvelope = redEnvelope;

        this.allMoney = allMoney;
    }

    //2、重写run()方法,指明线程要进行的事情

    @Override
    public void run() {
        //5、第一步获取当前线程的名字
        String name = Thread.currentThread().getName();


        //7、定义一个变量记录抢到的红包钱数
        int count = 0;


        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();//打印堆栈信息
        }

        //8、开始循环抢红包
            while (true) {
                //11、保证线程安全,是线程的意义之一   -------->得放在里面,不然可能会导致只有一个人在抢红包
                synchronized (reEnvelope) {
                //14、设置退出条件
                if (reEnvelope.size() == 0){
//                    System.out.println("活动结束");
                    break;
                }

                //6、随机获取一个红包-->因此要创建随机数对象
                int index = r.nextInt(reEnvelope.size());

                //9、从集合中获取对应的红包
                int money = reEnvelope.get(index);

                //13、输当前员工抢到的单个红包
                System.out.println(name + "抢到了红包" + money);

                //10----------------->下一步的思路是删除抢到的红包,等到红包数为0的时候,就结束
                //10、删除被当前员工抢到的红包
                reEnvelope.remove(index);//不可直接写,money,会当做索引

                //12、累加红包值到
                count += money;
            }

                //15、最后将总的金额添加到集合中去
                allMoney.add(name + "抢到红包总计" + count);

                //16、最后输出总金额

        }

//        System.out.println(allMoney);
//        System.out.println(或);


    }
}
